package com.huawei.csi.tool.validation;

import com.vladsch.flexmark.ast.Heading;
import com.vladsch.flexmark.ast.Link;
import com.vladsch.flexmark.ast.Paragraph;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.util.ast.Document;
import com.vladsch.flexmark.util.ast.Node;
import com.vladsch.flexmark.util.data.MutableDataSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 验证
 *
 * @author lxw
 */
public abstract class AbstractVerify {
    /**
     * 二级标题排除的内容
     */
    List<String> HEAD_EXCLUDE_LIST = List.of("[未发布]", "[Unreleased]");

    /**
     * 三级标题校验的内容 （暂时先放这里，下一个版本再改）
     * 思路：后续搞成配置文件读取配置信息进行判断
     */
    List<String> HEAD_THREE_LIST = List.of("Added", "Fixed", "Changed", "Deprecated", "Removed", "Security");

    /**
     * LOGGER
     */
    Logger LOGGER = LoggerFactory.getLogger(AbstractVerify.class);

    /**
     * 是否校验通过
     */
    boolean isVerifiedPassed = false;

    public void setVerifiedPassed(boolean verifiedPassed) {
        isVerifiedPassed = verifiedPassed;
    }

    /**
     * license 校验 返回license spdxId
     *
     * @param path path
     * @return string
     */
    protected String verify(Path path) {
        return "";
    }

    /**
     * 验证通过
     *
     * @param path 验证结果
     * @return boolean
     **/
    public boolean isVerifiedPassed(Path path) {
        try {
            LOGGER.info("正在解析文件内容，path={}", path);
            String markdownContent = new String(Files.readAllBytes(path));
            if (markdownContent.isEmpty()) {
                LOGGER.info("文件内容为空！path={}", path);
                return false;
            }
            // 创建一个 MutableDataSet 对象用于配置解析器
            MutableDataSet options = new MutableDataSet();
            // 创建解析器
            Parser parser = Parser.builder(options).build();
            // 使用解析器解析 Markdown 文本
            AtomicInteger index = new AtomicInteger(0);
            Document document = parser.parse(markdownContent);
            isVerifiedPassed = visit(document, index);
            LOGGER.info("验证文件内容完成，path={}, 验证结果= {}", path, isVerifiedPassed);
            return isVerifiedPassed;
        } catch (IOException e) {
            LOGGER.error("读取文件异常: {}", e.getMessage());
            throw new RuntimeException(e);
        }
    }

    private boolean visit(Node node, AtomicInteger index) {
        if (index.get() == 1) {
            if (!(node instanceof Heading)) {
                if (!(node instanceof Paragraph && node.getFirstChild() instanceof Link)) { // 开头为图片链接或者文字链接跳过
                    LOGGER.info("文本内容第一行非标题非图片或链接数据 数据class={}，firstChild class={}," +
                                    "README 参考格式链接 https://github.com/dart-lang/pana/blob/master/README.md" +
                                    "CHANGELOG 参考格式链接 https://keepachangelog.com/zh-CN/1.1.0/",
                            node.getClass().getName(),
                            Objects.requireNonNull(node.getFirstChild()).getClass().getName());
                    return false;
                }
            }
        }
        if (node instanceof Heading heading) {
            // 检查标题级别是否在1到6之间
            if (heading.getLevel() < 1 || heading.getLevel() > 6) {
                LOGGER.info("找到不符合规范的标题: {} (级别: {})", heading.getText(), heading.getLevel());
                return false;
            } else {
                return verifyHeading(heading);
            }
        } else if (node instanceof Paragraph paragraph) {
            // 检查段落是否以正确的方式结束
            if (paragraph.getFirstChild() == null) {
                LOGGER.info("找到不符合规范的段落: {}", paragraph.getChildChars());
                return false;
            } else {
                return verifyParagraph(paragraph);
            }
        }
        // 递归访问子节点
        for (Node child : node.getChildren()) {
            index.getAndIncrement();
            boolean visit = visit(child, index);
            if (!visit) {
                return false;
            }
        }
        return true;
    }

    /**
     * 校验标题
     *
     * @param heading 标题类型
     * @return boolean
     **/
    boolean verifyHeading(Heading heading) {
        return true;
    }

    /**
     * 校验段落内容
     *
     * @param paragraph body
     * @return boolean
     */
    boolean verifyParagraph(Paragraph paragraph) {
        return true;
    }

}
